package sistema;

import java.io.FileOutputStream;
import java.util.LinkedList;
import java.util.Queue;

public class GerenciadorMaquinasNaoFixas implements Gerenciador {
	private static String diretorioArquivos = "/home/isabellylr/workspace";
	private static int INDICE_GERADOR, INDICE_FILTRO, INDICE_CONTADOR;
	private Queue<String> fila = new LinkedList<String>();
	private Thread[] tarefas = new Thread[6];
	
	@Override
	public void gerenciar() {
		for (int i = 0; i < 6; i++) {
			if (fila.isEmpty()) {
				criaGeradorDeNumerosJDF();
				tarefas[i] = new ThreadTarefa("GeradorDeNumeros" + INDICE_GERADOR);
				tarefas[i].start();	
			} else {
				if (!tarefas[i].isAlive()) {
					adicionaTarefaNaFila(tarefas[i].getName());
					String proximaTarefa = criaProximaTarefaJDF(fila.poll());
					tarefas[i] = new ThreadTarefa(proximaTarefa);
					tarefas[i].start();
				}
			}
		}
	}
	
	private void adicionaTarefaNaFila(String tarefa) {
		if (tarefa.contains("GeradorDeNumeros")) {
			fila.add("arquivo" + tarefa.substring(tarefa.length()-1));
		} else if (tarefa.contains("Filtro")) {
			fila.add("arquivoFiltrado" + tarefa.substring(tarefa.length()-1));
		} 
	}
	
	private String criaProximaTarefaJDF(String primeiroDaFila) {
		if (primeiroDaFila.contains("arquivoFiltrado")) {
			criaContadorDeOcorrenciaJDF(primeiroDaFila);
			return "ContadorDeOcorrencia" + INDICE_CONTADOR;
		} else if (primeiroDaFila.contains("arquivo")) {
			criaFiltroJDF(primeiroDaFila);
			return "Filtro" + INDICE_FILTRO;
		}
		return null;
	}
	
	private void criaGeradorDeNumerosJDF() {
		try {
			(new FileOutputStream("Jobs/GeradorDeNumeros" + ++INDICE_GERADOR + ".jdf")).write(
			("job :\nlabel 	: GeradorDeNumeros" + INDICE_GERADOR + "\n\ntask :\n" +
			"init 	: put " + diretorioArquivos + "/bin/sistema/GeradorDeNumeros.class GeradorDeNumeros.class\n" +
			"remote 	: java -cp . GeradorDeNumeros arquivo" + INDICE_GERADOR + "\n" +
			"final   : get arquivo" + INDICE_GERADOR + " " + diretorioArquivos + "/Files/arquivo" + INDICE_GERADOR).getBytes());
		} catch (Exception ex) { }
	}
	
	private void criaFiltroJDF(String arquivo) {
		try {
			(new FileOutputStream("Jobs/Filtro" + ++INDICE_FILTRO + ".jdf")).write(
			("job :\nlabel 	: Filtro" + INDICE_FILTRO + "\n\ntask :\n" +
			"init 	: put " + diretorioArquivos + "/Files/" + arquivo + " " + arquivo + "\n" +
			"put " + diretorioArquivos + "/bin/sistema/Filtro.class Filtro.class\n" +
			"remote 	: java -cp . Filtro " + arquivo + " arquivoFiltrado" + INDICE_FILTRO + "\n" +
			"final   : get arquivoFiltrado" + INDICE_FILTRO + " " + diretorioArquivos + "/Files/arquivoFiltrado" + INDICE_FILTRO).getBytes());
		} catch (Exception ex) { }
	}
	
	private void criaContadorDeOcorrenciaJDF(String arquivoFiltrado) {
		try {
			(new FileOutputStream("Jobs/ContadorDeOcorrencia" + ++INDICE_CONTADOR + ".jdf")).write(
			("job :\nlabel 	: ContadorDeOcorrencia" + INDICE_CONTADOR + "\n\ntask :\ninit 	: " +
			"put " + diretorioArquivos + "/Files/" + arquivoFiltrado + " " + arquivoFiltrado + "\n" +
			"put " + diretorioArquivos + "/Ocorrencia" + " Ocorrencia\n" +
			"put " + diretorioArquivos + "/bin/sistema/ContadorDeOcorrencia.class ContadorDeOcorrencia.class\n" +
			"remote 	: java -cp . ContadorDeOcorrencia " + arquivoFiltrado + " Ocorrencia\n" +
			"final   : get Ocorrencia " + diretorioArquivos + "/Ocorrencia").getBytes());
		} catch (Exception ex) { }
	}
}